// 宏定义

#pragma once

#include <string>
#include <unordered_map>

namespace zl
{
  #define KEY_METHOD "method"  // 定义键名常量，用于标识方法名
  #define KEY_PARAMS "parameters"  // 定义键名常量，用于标识参数
  #define KEY_TOPIC_KEY "topic_key"  // 定义键名常量，用于标识主题键
  #define KEY_TOPIC_MSG "topic_msg"  // 定义键名常量，用于标识主题消息
  #define KEY_OPTYPE "optype"  // 定义键名常量，用于标识操作类型
  #define KEY_HOST "host"  // 定义键名常量，用于标识主机
  #define KEY_HOST_IP "ip"  // 定义键名常量，用于标识主机IP地址
  #define KEY_HOST_PORT "port"  // 定义键名常量，用于标识主机端口
  #define KEY_RCODE  "rcode"  // 定义键名常量，用于标识返回码
  #define KEY_RESULT  "result"  // 定义键名常量，用于标识结果

    // 定义消息类型枚举类
  enum class MType
  {
    REQ_RPC=0,    // RPC请求
    RSP_RPC,      // RPC响应
    REQ_TOPIC,    // 主题请求
    RSP_TOPIC,    // 主题响应
    REQ_SERVICE,  // 服务请求
    RSP_SERVICE   // 服务响应
  };
  
  // 定义返回码枚举类
  enum class RCode
  {
    RECODE_OK=0,            // 成功
    RECODE_PARSE_FAILED,    // 解析失败
    RCODE_ERROR_MSGTYPE,    // 消息类型错误
    RCODE_INVALID_MSG,      // 无效的消息
    RCODE_DISCONNECTED,     // 断开连接
    RCODE_INVALID_PARAMS,   // 无效的参数
    RCODE_NOT_FOUND_SERVICE,// 未找到服务
    RCODE_INVALID_OPTYPE,   // 无效的操作类型
    RCODE_NOT_FOUND_TOPIC,  // 未找到主题
    RCODE_INTERNAL_ERROR    // 内部错误
  };

  static std::string errReason(RCode code)
  {
    static std::unordered_map<RCode, std::string> errMap = {
        {RCode::RECODE_OK, "成功处理！"},
        {RCode::RECODE_PARSE_FAILED, "消息解析失败！"},
        {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误！"},
        {RCode::RCODE_INVALID_MSG, "无效消息"},
        {RCode::RCODE_DISCONNECTED, "连接已断开！"},
        {RCode::RCODE_INVALID_PARAMS, "无效的Rpc参数！"},
        {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务！"},
        {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型"},
        {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题！"},
        {RCode::RCODE_INTERNAL_ERROR, "内部错误！"}
    };

    auto it = errMap.find(code);
    return it != errMap.end() ? it->second : "未知错误！";
  }


// 请求类型枚举类，用于区分不同的请求模式
enum class RType
{
    REQ_ASYNC = 0,       // 异步请求类型
    REQ_CALLBACK         // 回调请求类型
};

// 主题操作类型枚举类，用于标识不同的主题操作
enum class TopicOptype {
    TOPIC_CREATE = 0,    // 创建主题
    TOPIC_REMOVE,        // 移除主题
    TOPIC_SUBSCRIBE,     // 订阅主题
    TOPIC_CANCEL,        // 取消订阅主题
    TOPIC_PUBLISH        // 发布主题
};

// 服务操作类型枚举类，用于标识不同的服务操作
enum class ServiceOptype {
    SERVICE_REGISTRY = 0,// 注册服务
    SERVICE_DISCOVERY,   // 发现服务
    SERVICE_ONLINE,      // 服务上线
    SERVICE_OFFLINE,     // 服务下线
    SERVICE_UNKNOW       // 未知服务状态
};
    
} 
